﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ElGaleticia.Cipher;
using ElGaleticia.Cipher.Math;
using System.Security.Cryptography;


namespace ElGaleticia
{
	class Program
	{
		static void Main(string[] args)
		{
			/*byte[] HashValue = { 59, 4, 248, 102, 77, 97, 142, 201, 210, 12, 224, 93, 25, 41, 100, 197, 213, 134, 130, 135 };
            
			BigInteger biHash = new BigInteger(HashValue);
            //bihash eh um biginteger gerado do vetor hashvalue
            
            
			ElGamal.EG_Secret_Key esk = ElGamal.GenerateKey(256);

           //gera a chave secreta 

			BigInteger[] sign = ElGamal.Sign(biHash, esk);

			byte[] epkB = ElGamal.formatEGPubKey(0, ElGamal.secKey2Pub(esk));
			ElGamal.EG_Public_Key newepk = ElGamal.parseEGPubKey(epkB);

            //gera uma assinatura

			string test = string.Format("{0}", ElGamal.Verify(sign, biHash, ElGamal.secKey2Pub(esk)));
            Console.WriteLine(test);
            */


			//elgamal.secKey2Pub(esk) copia os valores da chave pública contina na struct esk, no caso, p, g e y
			//Elgamal.verify recebe a assinatura sign, o biHash e a struct que contem a chave pública e 
			//retorna uma variável do tipo bool
			//O comando Elgamal.Verify vai verificar a assinatura é válida

			Console.WriteLine("Escreva");

			//mensagem
			string message = Console.ReadLine();

			//transforma uma string texto em um vetor de bytes bytes
			byte[] data = Helper.StringToBytes(message);

			//digest = hash(mensagem)
			//byte[] digest = new byte[data.Length];
			//sha1 é uma função hash 
			//SHA1 sha = new SHA1CryptoServiceProvider();
			//byte[] digest = sha.ComputeHash(data);

			//BigInteger equivalente ao digest da mensagem
			//BigInteger biDigest = new BigInteger(digest);

			//BigInteger biData = new BigInteger(data);
			
			BigInteger biData = new BigInteger(System.Text.Encoding.UTF8.GetBytes(message));

			//gera uma chave privada de tamanho 256bit = 32bytes
			ElGamal.EG_Secret_Key secretKey = ElGamal.GenerateKey(256);

			//gera a chave publica de uma dada chave privada
			ElGamal.EG_Public_Key publicKey = ElGamal.secKey2Pub(secretKey);

			//gera uma assinatura
			//BigInteger[] signature = ElGamal.Sign(biDigest, secretKey);

			//imprime se está assinado corretamente
			//Console.WriteLine(string.Format("{0}", ElGamal.Verify(signature, biDigest, publicKey)));

			//encripta a mensagem:
			ElGamal elga = new ElGamal();
			BigInteger[] biEnc = elga.Encrypt(biData, publicKey);

			//decripta a mensagem:
			BigInteger biDec = elga.Decrypt(biEnc, secretKey);

			//Console.WriteLine(Helper.BytesToString(biDec.getBytes()));
			Console.WriteLine(System.Text.Encoding.UTF8.GetString(biDec.getBytes()));

			//fim
			Console.ReadKey();
		}
	}
}
